import os
import sys
import tkinter as tk
from tkinter import messagebox
from gui import PatchInstallerGUI
from constants import APP_NAME, APP_VERSION
import cli

# 添加socket模块导入，用于主机名获取
try:
    import socket
except ImportError:
    socket = None

# 检查是否以管理员权限运行
def check_admin_permission():
    """检查是否以管理员权限运行"""
    try:
        import ctypes
        return ctypes.windll.shell32.IsUserAnAdmin() != 0
    except Exception:
        return False

def main():
    """主函数 - GUI模式入口"""
    # 检查管理员权限
    if not check_admin_permission():
        result = messagebox.askyesno(
            "权限警告",
            "安装Windows补丁需要管理员权限。是否以管理员身份重新启动程序？"
        )
        if result:
            try:
                # 以管理员身份重启程序
                import ctypes
                ctypes.windll.shell32.ShellExecuteW(
                    None,
                    "runas",
                    sys.executable,
                    " ".join(sys.argv),
                    None,
                    1
                )
            except Exception as e:
                messagebox.showerror("错误", f"重启程序失败：{str(e)}")
        return
    
    # 创建主窗口
    root = tk.Tk()
    
    # 设置窗口图标（如果有）
    try:
        # 查找图标文件
        if getattr(sys, "frozen", False):
            # 打包为EXE时
            icon_path = os.path.join(os.path.dirname(sys.executable), "favicon.ico")
        else:
            # 源码运行时
            icon_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "favicon.ico")
        
        if os.path.isfile(icon_path):
            root.iconbitmap(icon_path)
    except Exception:
        pass
    
    # 创建应用程序实例
    app = PatchInstallerGUI(root)
    
    # 窗口关闭事件处理
    def on_closing():
        if app.is_installing:
            if messagebox.askyesno("确认关闭", "安装正在进行中，确定要关闭程序吗？"):
                app.was_canceled = True
                root.destroy()
        else:
            root.destroy()
    
    root.protocol("WM_DELETE_WINDOW", on_closing)
    
    # 启动主循环
    try:
        root.mainloop()
    except Exception as e:
        messagebox.showerror("错误", f"程序运行出错：{str(e)}")
        raise

def cli_mode():
    """命令行模式入口（调用优化后的cli模块）"""
    try:
        # 确保传递命令行参数给cli.run_cli_mode
        return cli.run_cli_mode(sys.argv[1:])
    except Exception as e:
        print(f"CLI模式错误：{str(e)}")
        import traceback
        traceback.print_exc()
        input("\n按任意键退出...")
        return 1

if __name__ == "__main__":
    # 打印程序信息
    print(f"{APP_NAME} v{APP_VERSION}")
    
    # 处理命令行参数
    if len(sys.argv) > 1:
        # 如果有命令行参数，尝试进入CLI模式
        exit_code = cli_mode()
        sys.exit(exit_code if isinstance(exit_code, int) else 0)
    else:
        # 默认启动GUI模式
        try:
            # 确保在GUI模式下设置正确的编码
            import locale
            try:
                locale.setlocale(locale.LC_ALL, '')
            except:
                pass
                
            main()
        except KeyboardInterrupt:
            print("程序被用户中断")
            sys.exit(1)
        except Exception as e:
            print(f"程序运行出错：{str(e)}")
            import traceback
            traceback.print_exc()
            input("\n按任意键退出...")
            sys.exit(1)